#pragma once

namespace PhysLeo {

/**
 * Customable interface.
 * any object which want to process any custom operation exclude animation and rendering in PhysLeo should extends this interface.
 */
class Customable {
public:
    /**
     * default constructor
     */
    Customable() = default;

    /**
     * delete default copy constructor
     */
    Customable(const Customable&) = delete;

    /**
     * delete default move constructor
     */
    Customable(Customable&&) = delete;

    /**
     * delete default copy assignment function
     */
    Customable& operator=(const Customable&) = delete;

    /**
     * delete default move assignment function
     */
    Customable& operator=(Customable&&) = delete;

    /**
     * default virtual destructor
     */
    virtual ~Customable() = default;

    /**
     *init custom resource, interface needs to be implemented
     */
	virtual void initCustomResource() = 0;

    /**
     * custom operation, interface needs to be implemented
     */
	virtual void customOperation() = 0;
};

}